﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Collections;
using System.Threading;
using System.Text.RegularExpressions;

using SistemaCenterQuimPost.Reportes; //usado para imprimir el Traslado
using SistemaCenterQuimPost.Entidad; //usado para generar los archivos.

using System.IO;    //3 referencias que son necesarias para el proceso de archivos.
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

namespace SistemaCenterQuimPost.UI.PostCajero
{
    public partial class frmTrasladosEntrada : SistemaCenterQuimPost.UI.frmTraslado
    {
       //---------------ATRIBUTOS------------------------------------
        private FileStream trasladoEntrada; //clase que maneja la información sobre el archvi y la forma de crearlo.
       

      //------------CONSTRUCTORES----------------------------------
        public frmTrasladosEntrada()
        {
            InitializeComponent();
            centerQuimDs = new DataSet2();
            movimientosTa = new DataSet2TableAdapters.MovimientosxProductoTableAdapter();

        }

        public frmTrasladosEntrada(int ancho, int alto) //frmGestiónProductos usan Administrador y Cajero, ambos usan diferentes 
        //tamaño de ventana. Al usar este formulario se reciben los tamaños de ventana ha usar en cada uno.
        {
            InitializeComponent();


            this.Width = ancho;
            this.Height = alto;
            this.MinimumSize = new System.Drawing.Size(ancho, alto); //Se establece el tamaño máximo y mínimo en pixeles.
            this.MaximumSize = new System.Drawing.Size(ancho, alto);

        }
      //---------------------ESTADOS------------------------------
        
        protected override void estEsperandoOperacion() //estado luego de realizar una busqueda exitosa, agregar o editar. Es decir con datos en vista.
        {
            estadoDelFormulario = "estEsperandoOperacion";

            System.Windows.Forms.Control[] controlesHabilitados = { this.txtCodBarra, this.btnBusCodigo, this.txtDescripcion, this.btnBusDescripcion };
            System.Windows.Forms.Control[] controlesDeshabilitados = { this.lstProductosCodBarra, this.lstProductosDescripcion };
            System.Windows.Forms.Control[] controlesVisibles = { };
            System.Windows.Forms.Control[] controlesInvisibles = { this.lstProductosCodBarra, this.lstProductosDescripcion, lblError };

            habilitarControles(controlesHabilitados);
            deshabilitarControles(controlesDeshabilitados);
            visibleControles(controlesVisibles);
            invisibleControles(controlesInvisibles);

            if (refrescarResgProductos) //si hace falta actualizar el refrescarResgProducto se realiza
            {
                ejecutarHiloActualizarResgProductos();

            }

            cargarTraslados();

            errorProvider1.Clear();  //se borran los errores, si habian.

            txtCodBarra.Focus();   //se deja el foco en txtCodBarra

            


        }
      //----------------METODOS VARIOS----------------------------

        protected override void limpiarDatos() //deja el formulario preparado para ingresar nuevos datos.
        {

            this.lblFechaValor.Text = "";
            this.lblTurnoValor.Text = "";
            this.lblNroValor.Text = "";
            this.lblUsuarioValor.Text = "";
            this.lblEmitidoValor.Text = "";


            this.txtCodBarra.Text = "";
            this.txtDescripcion.Text = "";

            this.dgvProductos.Rows.Clear();

        }

        private ArrayList obtenerNombresPost() //obtiene los nombres de los post.
        {
            string[] listaSubcarpetas; //variable que almacenará la lista de todas las subcarpetas dentro de Dropbox.
            listaSubcarpetas = Directory.GetDirectories("C:\\Dropbox"); //obtenemos la lista de las subcarpetas en Dropbox.

            ArrayList nombresPost = new ArrayList(); //creamos un arrayList, que almacenará solo los nombre de los post
            nombresPost.Clear(); //vaciamos el arrayList

            foreach (string unaSubcarpeta in listaSubcarpetas)
            {
                FileInfo unFileInfo = new FileInfo(unaSubcarpeta); //creamos un FileInfo que almacen
                if (Regex.Match(unFileInfo.Name, "POST*").Success)
                {
                    nombresPost.Add(unFileInfo.Name);
                }
            }

            return (nombresPost);

        }

        private void cargarTraslados() //carga los traslados disponibles en el post.
        {
            this.cboTraslados.Items.Clear(); //borra todo lo que tenía antes. 

            string directorioPedido = "C:\\Dropbox\\Datos del Sistema\\Traslados"; //seteamos el directorio desde donde leeremos los archivos

            foreach (string archivo in Directory.GetFiles(directorioPedido))  //por cada archvio en este directorio
            {
                FileInfo archivoInfo = new FileInfo(archivo);  //obtenemos información de ese directorio

                cboTraslados.Items.Add(archivoInfo.Name); //mostramos solo su nombre corto.

            }

        }

       
        private void btnBusPedido_Click(object sender, EventArgs e) //metodo capturador de evento click sobre el boton lupa para buscar pedido.
        {
            leerArchivo(); //se procesa la lectura de la 

        }

        private void leerArchivo()
        {
            if (cboTraslados.Text == "")
            {
                MessageBox.Show("Debe seleccionar un traslado para el post seleccionado.", "TRASLADO ENTRADA", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
            else
            {
                
                string nombreArchivo = "C:\\Dropbox\\Datos del Sistema\\Traslados\\" + cboTraslados.SelectedItem.ToString();


                //guardar el archivo a través del objeto FileStream.
                try
                {
                    //abre el archivo para leerlo.
                    trasladoEntrada = new FileStream(nombreArchivo, FileMode.Open, FileAccess.Read); //crea el objeto FileStream para obtener acceso de lectura al archivo.

                    leerTraslado();  //lee el encabezado y el cuerpo y lo muestra en el forms.

                    //cuando ya no tiene más datos se lanza la excepcion SerializationException para informar que terminó.

                }

                catch (SerializationException)
                {
                    MessageBox.Show("Traslado recibido con éxito!!", "ENVIAR PRODUCTOS", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }

                catch (FormatException)
                {
                    //notifica al usuario si el archivo no existe
                    MessageBox.Show("Formato inválido", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                catch (IOException)
                {
                    //notifica al usuario si el archivo no existe
                    MessageBox.Show("Error al abrir el archivo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa. /n /n Comuniquese con su desarrollador para solucionar el problema /n /n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    this.Close();
                }

                finally
                {
                    cerrarArchivo();
                }

            }

        }

        private void leerTraslado()  //lee los datos de la orden de compra enviada por el cajero y lo carga a la grilla.
        {
            //-------LEER ENCABEZADOS-----------------
            RegistroTraslado unRegistroTraslado = (RegistroTraslado)aplicadorFormato.Deserialize(trasladoEntrada);

            lblFechaValor.Text = unRegistroTraslado.Fecha;
            lblTurnoValor.Text = unRegistroTraslado.Turno;
            lblNroValor.Text = unRegistroTraslado.CodTraslado.ToString();
            lblUsuarioValor.Text = unRegistroTraslado.CajeroNombre;
            lblEmitidoValor.Text = unRegistroTraslado.PostOrigenNombre;
            
            

            dgvProductos.Rows.Clear(); //borramos las filas de la grilla.

            do
            {       //instanciamos un RegistroListaPrecio(Serializado) y le asignamos el primer objeto del archivo
                RegistroProductoTraslado unRegistroProductoTraslado = (RegistroProductoTraslado)aplicadorFormato.Deserialize(trasladoEntrada);

                dgvProductos.Rows.Add(unRegistroProductoTraslado.CodProducto, unRegistroProductoTraslado.Descripcion, Convert.ToInt32(unRegistroProductoTraslado.Cantidad));


            } while (trasladoEntrada != null);

        }


        protected override void altaTraslado()
        {
            //base.altaTraslado();
            trasladosTa.InsertQueryTraslados(Convert.ToDateTime (obtenerFechaActual()), cboTurno.Text, obtenerCodUsuarioActual(), "E", lblEmitidoValor.Text.Trim().ToUpper());

        }

        protected override void redefenirStock()
        {
            //base.redefenirStock();
            foreach (DataGridViewRow row in dgvProductos.Rows)//recorremos el datagride y actualizamos stock
            {
                productosTa.FillByCodigoyDescripcion(centerQuimDs.Productos, row.Cells[0].Value.ToString (), row.Cells[1].Value.ToString ());
                if (centerQuimDs.Productos[0].tipo == "B") //si el producto es base
                {
                    centerQuimDs.Productos[0].stockActual += Math.Round(Convert.ToDouble(row.Cells[2].Value), 3);
                }
                else //si no es base, entonces puede ser un terminado o un producto disuelto vendido por cantidad.
                {
                    centerQuimDs.Productos[0].stockActual += Convert.ToInt32(row.Cells[2].Value);
                }
                
                productosTa.Update(centerQuimDs.Productos);

                movimientosProductosAltaTraslado(row.Cells[0].Value.ToString(), row.Cells[1].Value.ToString(), Convert.ToDecimal(row.Cells[2].Value));
            }

        }
        private void  movimientosProductosAltaTraslado(string codigo, string nombre, decimal cantidad)
        {
            movimientosTa.InsertQueryMovimientosxProducto(codigo, nombre, Convert.ToDateTime(obtenerFechaActual()), "A", "Traslado Entrada Nº" + trasladosTa.ScalarQueryTraslados().ToString(), cantidad);
        }

        private void cerrarArchivo()
        {
            try
            {
                if (trasladoEntrada != null)  //determina si existe el archivo
                {
                    trasladoEntrada.Close();  //cierra el archivo
                }

            }
            catch (IOException)  //notifica al usuario del error al cerrar el archivo
            {
                MessageBox.Show("No se puede cerrar el archivo.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }

        protected override void eliminarArchivo()
        {
            if (trasladoEntrada != null)
            {
                File.Delete(trasladoEntrada.Name);
            }
        }

        private void frmTrasladosEntrada_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)
            {

                bool tieneError = false;

                foreach (System.Windows.Forms.Control ctrl in this.Controls)
                {
                    if (errorProvider1.GetError(ctrl) != "")
                    {
                        tieneError = true;
                    }
                }

                if (tieneError) mostrarErrores();
            }
            
            else
            {
                if (e.KeyCode == Keys.F12)
                {
                    cargarTraslados();

                }
            }
        }

    }


}
